【JavaScript / DOM】ノードの取得 - getElement(s)By* / querySelectorAll
JavaScript/DOMの『ノードの取得』について解説します。
検証環境
ノードの取得
JavaScript/DOMはHTMLドキュメントのノードを取得できます。
ここでは要素ノード、属性ノード、テキストノード、コメントノードの取得方法について解説します、
要素ノード
Documentオブジェクトのメソッドでタグ名や属性(idやclassなど)の値を指定し、要素ノードを取得することが可能です。
主な5つのメソッドについて以下に解説します。
タグ名(getElementsByTagName)
DocumentオブジェクトのgetElementsByTagName
メソッドはタグ名を指定して要素ノードを取得できます。
基本構文
document.getElementsByTagName("タグ名")
サンプル
<h1>JavaScriptとは</h1>
<p>JavaScriptはプログラミング言語の1つです。</p>
<p>主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。</p>
<script type="text/javascript">
___ih_hl_start
let elements = document.getElementsByTagName("p");
___ih_hl_end
console.log(elements);
for( let element of elements ) {
console.log(element);
}
</script>
HTMLCollection(2) [p, p]
<p>JavaScriptはプログラミング言語の1つです。</p>
<p>主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。</p>
getElementsByTagName
メソッドはHTMLCollectionを取得します。
HTMLCollectionは配列のようなデータ構造を持つ、複数の要素ノードを格納したオブジェクトです。
このオブジェクトに要素ノードが格納されているため、個々の要素ノードはfor文などを使って1つずつ取り出します。
id属性(getElementById)
DocumentオブジェクトのgetElementById
メソッドはid属性の値を指定して要素ノードを取得できます。
基本構文
document.getElementById("id属性値")
サンプル
<h1 id="title">JavaScriptとは</h1>
<p>JavaScriptはプログラミング言語の1つです。</p>
<p>主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。</p>
<script type="text/javascript">
___ih_hl_start
let elements = document.getElementById("title");
___ih_hl_end
console.log(elements);
</script>
<h1 id="title">JavaScriptとは</h1>
5行目のdocument.getElementById("title")
がid属性値を指定した要素ノードの取得です。
id属性値がtitle
の要素ノードを取得しています。
class属性(getElementsByClassName)
DocumentオブジェクトのgetElementsByClassName
メソッドはclass属性の値を指定して要素ノードを取得できます。
基本構文
document.getElementsByClassName("class属性値")
サンプル
<h1 class="text">JavaScriptとは</h1>
<p class="text">JavaScriptはプログラミング言語の1つです。</p>
<p class="text">主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。</p>
<script type="text/javascript">
___ih_hl_start
let elements = document.getElementsByClassName("text");
___ih_hl_end
console.log(elements);
for( let element of elements ) {
console.log(element);
}
</script>
HTMLCollection(3) [h1.text, p.text, p.text]
<h1 class="text">JavaScriptとは</h1>
<p class="text">JavaScriptはプログラミング言語の1つです。</p>
<p class="text">主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。</p>
getElementsByClassName
メソッドはHTMLCollectionを取得します。
HTMLCollectionは配列のようなデータ構造を持つ、複数の要素ノードを格納したオブジェクトです。
このオブジェクトに要素ノードが格納されているため、個々の要素ノードはfor文などを使って1つずつ取り出します。
name属性(getElementsByName)
DocumentオブジェクトのgetElementsByName
メソッドはname属性の値を指定して要素ノードを取得できます。
基本構文
document.getElementsByName("name属性値")
サンプル
<h1 name="text">JavaScriptとは</h1>
<p name="text">JavaScriptはプログラミング言語の1つです。</p>
<p name="text">主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。</p>
<script type="text/javascript">
___ih_hl_start
let elements = document.getElementsByName("text");
___ih_hl_end
console.log(elements);
for( let element of elements ) {
console.log(element);
}
</script>
NodeList(3) [h1, p, p]
<h1 name="text">JavaScriptとは</h1>
<p name="text">JavaScriptはプログラミング言語の1つです。</p>
<p name="text">主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。</p>
getElementsByName
メソッドはNodeListを取得します。
NodeListは配列のようなデータ構造を持つ、複数の要素ノードを格納したオブジェクトです。
このオブジェクトに要素ノードが格納されているため、個々の要素ノードはfor文などを使って1つずつ取り出します。
CSSセレクター(querySelectorAll)
DocumentオブジェクトのquerySelectorAll
メソッドはCSSセレクター形式の指定方法で要素を取得できます。
基本構文
document.querySelectorAll("セレクター形式")
サンプル
<h1 id="title">JavaScriptとは</h1>
<div class="box">
<p class="text">JavaScriptはプログラミング言語の1つです。</p>
</div>
<p class="text">主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。</p>
<input type="text" value="test">
<script type="text/javascript">
___ih_hl_start
let elements1 = document.querySelectorAll("#title");
___ih_hl_end
console.log(elements1);
for( let element of elements1 ) {
console.log(element);
}
___ih_hl_start
let elements2 = document.querySelectorAll(".box .text");
___ih_hl_end
console.log(elements2);
for( let element of elements2 ) {
console.log(element);
}
___ih_hl_start
let elements3 = document.querySelectorAll('[type="text"]');
___ih_hl_end
console.log(elements3);
for( let element of elements3 ) {
console.log(element);
}
</script>
NodeList [h1#title]
<h1 id="title">JavaScriptとは</h1>
NodeList [p.text]
<p class="text">JavaScriptはプログラミング言語の1つです。</p>
NodeList [input]
<input type="text">
querySelectorAll
メソッドはNodeListを取得します。
NodeListは配列のようなデータ構造を持つ、複数の要素ノードを格納したオブジェクトです。
このオブジェクトに要素ノードが格納されているため、個々の要素ノードはfor文などを使って1つずつ取り出します。
応用
要素ノードはHTMLドキュメントにおける要素の階層構造(親子関係)と同様の階層関係を持ちます。
要素ノードに対して、上記の要素ノード取得メソッドを呼び出すこともでき、Documentオブジェクトから呼び出した場合はHTMLドキュメント全体が対象ですが、要素ノードの場合は子要素が対象となります。
<h1>JavaScriptとは</h1>
<div id="box">
<p>JavaScriptはプログラミング言語の1つです。</p>
<p>主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。</p>
</div>
<p>JavaScriptで記述したファイルをJSファイル(またはJavaScriptファイル)と呼びます。</p>
<p>ブラウザで動作するにはHTMLドキュメントからJSファイルを読み込みます。</p>
<script type="text/javascript">
let box = document.getElementById("box");
console.log(box);
___ih_hl_start
let sentences = box.getElementsByTagName("p");
___ih_hl_end
console.log(sentences);
for( let e of sentences ) {
console.log(e);
}
</script>
<div id="box">...</div>
HTMLCollection(2) [p, p]
<p>JavaScriptはプログラミング言語の1つです。</p>
<p>主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。</p>
10行目でdiv
要素(2〜5行目の部分)を取得しています。
その要素に対して14行目のbox.getElementsByTagName("p")
でタグ名がp
の子要素を取得しています。
実行結果から子要素のp
要素ノードのみ取得したことが確認できます。
属性ノード
属性ノードは要素ノードのattributes
プロパティから取得します。
基本構文
要素ノード.attributes[インデックス]
サンプル
<h1 id="title">JavaScriptとは</h1>
<div id="box">
<!-- JavaScriptの概要 -->
<p id="text" class="line">JavaScriptはプログラミング言語の1つです。</p>
主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。
</div>
<script type="text/javascript">
let element = document.getElementById("text");
___ih_hl_start
console.log(element.attributes);
___ih_hl_end
___ih_hl_start
console.log(element.attributes[0]);
console.log(element.attributes[1]);
___ih_hl_end
</script>
NamedNodeMap {0: id, 1: class, id: id, class: class, length: 2}
id="text"
class="line"
attributes
プロパティ値はNamedNodeMapオブジェクトです。
NamedNodeMapオブジェクトは要素ノードの全ての属性ノードを配列構造のように記憶しています。
各属性ノードは配列のようにブランケット記法でインデックスを指定して取得できます。
テキストノード
テキストノードは要素ノードのchildNodes
プロパティ経由で取得します。
基本構文
要素ノード.childNodes[インデックス]
サンプル
<h1 id="title">JavaScriptとは</h1>
<div id="box">
<!-- JavaScriptの概要 -->
<p id="text" class="line">JavaScriptはプログラミング言語の1つです。</p>
主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。
</div>
<script type="text/javascript">
let element = document.getElementById("box");
___ih_hl_start
console.log(element.childNodes);
___ih_hl_end
___ih_hl_start
console.log(element.childNodes[0]);
console.log(element.childNodes[2]);
console.log(element.childNodes[4]);
___ih_hl_end
</script>
NodeList(5) [text, comment, text, p#text.line, text]
#text
...省略
data: "\n "
...省略
#text
...省略
data: "\n "
...省略
" 主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。 "
childNodes
プロパティ値はNodeListオブジェクトです。
NodeListオブジェクトは要素ノードの全ての子ノードを配列構造のように記憶しています。
各テキストノードは配列のようにブランケット記法でインデックスを指定して取得できます。
※ 実行結果の#text
は各ノード間の改行や空白を含むテキストノードです。
また、childNodes
プロパティは全ての子ノードを含むため、テキストノードのみを動的に取得するにはnodeType
プロパティが便利です。
nodeType
プロパティはノードの種類を表し、値が3
のノードはテキストノードになります。
<h1 id="title">JavaScriptとは</h1>
<div id="box">
<!-- JavaScriptの概要 -->
<p id="text" class="line">JavaScriptはプログラミング言語の1つです。</p>
主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。
</div>
<script type="text/javascript">
let element = document.getElementById("box");
console.log(element.childNodes);
___ih_diff_start
- console.log(element.childNodes[0]);
- console.log(element.childNodes[2]);
- console.log(element.childNodes[4]);
+ for( let e of element.childNodes ) {
+ if( e.nodeType == 3 ) {
+ console.log(e);
+ }
+ }
___ih_diff_end
</script>
NodeList(5) [text, comment, text, p#text.line, text]
#text
...省略
data: "\n "
...省略
#text
...省略
data: "\n "
...省略
" 主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。 "
コメントノード
テキストノードは要素ノードのchildNodes
プロパティ経由で取得します。
基本構文
要素ノード.childNodes[インデックス]
サンプル
<h1 id="title">JavaScriptとは</h1>
<div id="box">
<!-- JavaScriptの概要 -->
<p id="text" class="line">JavaScriptはプログラミング言語の1つです。</p>
主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。
</div>
<script type="text/javascript">
let element = document.getElementById("box");
___ih_hl_start
console.log(element.childNodes);
___ih_hl_end
___ih_hl_start
console.log(element.childNodes[1]);
___ih_hl_end
</script>
NodeList(5) [text, comment, text, p#text.line, text]
<!-- JavaScriptの概要 -->
コメントノードの取得はテキストノードと同様です。
こちらもnodeType
プロパティを使うことでインデックスを指定することなく動的に取得できます。
コメントノードのnodeType
プロパティ値は8
です。
<h1 id="title">JavaScriptとは</h1>
<div id="box">
<!-- JavaScriptの概要 -->
<p id="text" class="line">JavaScriptはプログラミング言語の1つです。</p>
主にブラウザの動的処理に使われますが、サーバーやアプリでも活躍します。
</div>
<script type="text/javascript">
let element = document.getElementById("box");
console.log(element.childNodes);
___ih_diff_start
- console.log(element.childNodes[1]);
+ for( let e of element.childNodes ) {
+ if( e.nodeType == 8 ) {
+ console.log(e);
+ }
+ }
___ih_diff_end
</script>
NodeList(5) [text, comment, text, p#text.line, text]
<!-- JavaScriptの概要 -->
ドキュメントノード
ドキュメントノードは“WEBドキュメントを表すノード”です。
JavaScript/DOMではドキュメントノードはDocumentオブジェクトとして扱います。
一般的なブラウザではWEBページを読み込むと、自動で変数document
にDocumentオブジェクトを格納します。
<script type="text/javascript">
console.log(document);
</script>
#document
注意点
ブラウザで実行する場合、HTMLドキュメントの読み込み(ロード)前はノードを取得できません。
HTMLドキュメントは上から順番に読み込まれるため、次のようなDOMの処理が先に実行されるコードは期待した処理にならないことに注意してください。
<script type="text/javascript">
let element = document.getElementById("title");
console.log(element);
</script>
<h1 id="title">JavaScriptとは</h1>
null
ノードを正常に取得するには、対象のノードが読み込まれた後に行う必要があります。